package com.szxx.suit;

import java.util.Comparator;
import java.util.List;

import com.szxx.domain.Cards;

@SuppressWarnings("rawtypes")
public interface ISuitAnalysisService {
	
	/** 按权值从大到小排列List */
	public static final Comparator<AbstractSuitAnalyzer> SUIT_COMPARATOR_DESC_BY_COUNT = new Comparator<AbstractSuitAnalyzer>() {
		@Override
		public int compare(AbstractSuitAnalyzer o1, AbstractSuitAnalyzer o2) {
			return -(o1.getPriority() - o2.getPriority());
		}
	};
	
	/** 按牌型大小升序排列 */
	public static final Comparator<AbstractSuitType> TYPE_COMPARATOR_ASC = new Comparator<AbstractSuitType>() {
		@Override
		public int compare(AbstractSuitType o1, AbstractSuitType o2) {
			if (o1 == null) {
				return -1;
			} else if (o2 == null) {
				return 1;
			} else {
				return o1.compareTo(o2);
			}
		}
	};

	/**
	 * 注册一个牌型分析器
	 * 
	 * @param newSuitFactory
	 */
	void register(AbstractSuitAnalyzer newSuitAnalyzer);

	/**
	 * 获取牌型分析器
	 * 
	 * @param type
	 * @return
	 */
	AbstractSuitAnalyzer getSuitAnalyzer(AbstractSuitType type);

	/**
	 * 获取所有的分析器类型
	 * 
	 * @return
	 */
	List<AbstractSuitType> listAbstractSuitType(boolean desc);
	
	/**
	 * 排列可能的牌型 <br>
	 * 返回  typelist 按照 权值 从小到大排列
	 * 
	 * @param cards
	 * @param term
	 * @return 不会返回null 和 带null元素 的 list
	 */
	List<AbstractSuitType> listPossibleTypes(Cards cards, AbstractSuitTerm term, boolean desc);
	
	/**
	 * 排列大于type的可能的牌型 <br>
	 * 返回  typelist 按照 权值 从小到大排列
	 * 
	 * @param cards
	 * @param term
	 * @param type
	 * @return 不会返回null 和 带null元素 的 list
	 */
	List<AbstractSuitType> listPossibleTypes(Cards cards, AbstractSuitTerm term, AbstractSuitType type, boolean desc);

	/**
	 * 用某个牌型来分析牌，排序，填充比大小的权值 <br>
	 * 
	 * @param cards
	 * @param term
	 * @return
	 */
	AbstractAnalysisResult analysis(Cards cards, AbstractSuitTerm term, AbstractSuitType type);
	
	/**
	 * 分析癞子牌
	 * 
	 * @param cards
	 * @param term
	 * @return
	 */
	List<Cards> analysisLaizi(Cards cards, AbstractSuitTerm term, AbstractSuitType type);
	
	/**
	 * 从手牌中分析出所有符合相应牌型的牌 <br>
	 * 
	 * @param cards 手牌
	 * @param term
	 * @param type
	 * @return 不会返回null 和 带null元素 的 list
	 */
	List<Cards> listInTypePossibleCards(Cards cards, AbstractSuitTerm term, AbstractSuitType type);
}
